﻿namespace Sgr.EventBus.RelayBoxs
{
    public class RelayBoxOptions
    {
        /// <summary>
        /// 消息处理失败后，允许的最大重试次数。
        /// 超过此次数后，消息将被标记为失败（或转入死信队列，根据配置）。
        /// </summary>
        /// <example>例如设为 3，则失败后会重试 3 次，总共尝试 4 次（原始 + 3 次重试）</example>
        public int MaxRetryAttempts { get; set; } = 3;

        /// <summary>
        /// 重试时间间隔的基准值，用于计算每次重试的等待时间。
        /// 通常用于实现「指数退避」策略，比如：基础间隔 * 2^(重试次数 - 1)
        /// 单位：秒
        /// </summary>
        public int RetryIntervalBase { get; set; } = 30;

        /// <summary>
        /// 每次重试间隔的最大允许值，避免因退避算法导致等待时间过长。
        /// 单位：秒
        /// </summary>
        public int MaxRetryInterval { get; set; } = 300;

        /// <summary>
        /// 消息处理成功后，在系统中保留的最长时间。
        /// 超过该时间后，消息可以被清理或归档，以节省存储空间。
        /// 单位：天，建议7 ~ 30 天
        /// </summary>
        public int SuccessMessageRetentionPeriod { get; set; } = 15;

        /// <summary>
        /// 消息处理失败后，在系统中保留的最长时间。
        /// 超过该时间后，消息可以被清理或归档。
        /// 单位：天，建议30 ~ 90 天
        /// </summary>
        public int FailedMessageRetentionPeriod { get; set; } = 90;

        /// <summary>
        /// 每次扫描消息表时，最多从数据库拉取的消息条数（扫描批量大小）。
        /// 用于控制每次任务执行的消息处理量。
        /// </summary>
        public int ScanBatchSize { get; set; } = 100;

        /// <summary>
        /// 每次清理已处理或失败消息时，最多删除的消息条数。(10 至2000之间)
        /// </summary>
        public int OutboxCleanupMaxBatchSize { get; set; } = 500;

        /// <summary>
        /// 每次清理已处理或失败消息时，最多执行的清理循环次数。(5 至500之间)
        /// </summary>
        public int OutboxCleanupMaxCycles { get; set; } = 20;

        ///// <summary>
        ///// 消息处于“处理中”（Processing）状态的最长允许时间。
        ///// 如果某条消息处理时间超过该值，则认为可能卡死，可触发告警或重置状态。
        ///// 单位：秒
        ///// </summary>
        //public int ProcessingStatusTimeout { get; set; } = 900;
    }
}